from PySide2 import QtWidgets
from PySide2.QtUiTools import QUiLoader
import sys
import time
import ExceInit
import os
import ToolFun
import config
import SetTestParameter
import datetime

# 电压差测试主界面
class MainWindowDiff:

    def __init__(self):
        # 获取基本信息
        self.InitDevice = config.get_init_device_value()  # 初始化测试类型
        self.fine_add = config.get_fine_add_value()  # 获取文件储存起始地址
        self.res = config.get_device_res_value()  # 获取文件标识符
        # 动态加载UI文件
        self.ui = QUiLoader().load("./UI/TestVoltageDiffUI.ui")  # 主界面文件
        self.ui.setWindowTitle("【古鑫】安捷伦34465 电压差测试软件 V1.0 ")
        self.set_parameter_window = None
        self.help_tool_window = None
        self.about_tool_window = None
        # 设置表格列宽
        config.ui_col_size_set(self.ui)

        # 【查询历史数据】点击槽函数
        self.ui.OpenFineTool.triggered.connect(self.open_fine_fool)
        # 【退出】点击槽函数
        self.ui.ExitTool.triggered.connect(self.exit_tool)
        # 【帮助信息】点击槽函数
        self.ui.HelpTool.triggered.connect(self.help_tool)
        # 【关于】点击槽函数
        self.ui.AboutTool.triggered.connect(self.about_tool)

        # 联机初始化测试
        self.test_link()
        # 【联机测试】点击槽函数
        self.ui.LinkTest.clicked.connect(self.test_link)
        # 【设置测试参数】点击槽函数
        self.ui.SetTestParameterButt.clicked.connect(self.set_parameter_ui)
        # 【SN输入框回车】槽函数
        self.ui.lineEdit.returnPressed.connect(self.text_enter)
        # 【开始测试】槽函数
        self.ui.StartTest.clicked.connect(self.text_enter)

    # 【查询历史数据】
    def open_fine_fool(self):
        os.startfile(self.fine_add)

    # 【退出】
    def exit_tool(self):
        app = config.get_app_value()
        sys.exit(app.exec_())

    # 【帮助信息】
    def help_tool(self):
        self.help_tool_window = ToolFun.HelpTool()
        self.help_tool_window.HelpTool.show()

    # 【关于】
    def about_tool(self):
        self.about_tool_window = ToolFun.AboutTool()
        self.about_tool_window.AboutTool.show()

    # 【联机测试】
    def test_link(self):
        ToolFun.test_link(self.ui)

    # 【设置测试参数】
    def set_parameter_ui(self):
        self.set_parameter_window = SetTestParameter.SetTestParameterWindowDiff()
        self.set_parameter_window.SetTestParameter.show()

    # SN文本回车后 & 点击开始测试槽函数
    def text_enter(self):
        self.table_data_write()  #启动测试
        self.ui.lineEdit.clear() #清除原本文本框的SN号

    # 电压差测试主函数
    def table_data_write(self):
       # 获取基础内容&和SN号
        test_parameter = config.get_test_parameter_value()  # 获取初始化测试内容
        number = config.get_number_value()  # 获取UI序列号
        excel_name = config.get_excel_name_value()  # 获取静置后Excel文件名
        self.res = config.get_device_res_value()  # 获取设备标识符

        # SN记录类初始化
        sn = ExceInit.SnData(excel_name)
        text = self.ui.lineEdit.text()  # 读取SN内容
        sys_time = (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 获取系统当前时间

        # 判断长度是否合格，合格后启动测试
        if len(text) == int(test_parameter['SNLenSpinBox']):
            test_crr_data = self.res.query("MEAS:VOLTAGE:DC?")  # 开启设备测试
            # list_value = ExceInit.econtent(file_path[0], text) # 在文件中查找SN和对应的前电压 （直接打开Excel进行遍历）
            list_value = ExceInit.seek_sn(text,config.get_excel_sn_list_value()) # 在文件中查找SN和对应的前电压（提前将SN号存为列表）

            # 判断EXCEL创建的类型（函数创建类和Excel软件创建类）
            if not list_value:
                # 如果出错
                pass
            elif isinstance(list_value['time'],str):# openpyxl 创建的类型为str
                pre_time = datetime.datetime.strptime(list_value['time'], '%Y-%m-%d %H:%M:%S')  # 获取旧时间，并格式化
                after_time = datetime.datetime.strptime(sys_time, '%Y-%m-%d %H:%M:%S')  # 获取当前时间，并格式化

                diff_time_temp = after_time - pre_time  # 时间对比
                diff_time = (diff_time_temp.days * 24) + ((diff_time_temp.seconds / 60) / 60)  #换算成小时
            elif isinstance(list_value['time'],datetime.datetime):# windows 创建的类型为datetime.datetime
                after_time = datetime.datetime.strptime(sys_time, '%Y-%m-%d %H:%M:%S')  # 获取当前时间

                diff_time_temp = after_time - list_value['time'] # 时间对比
                diff_time = (diff_time_temp.days * 24) + ((diff_time_temp.seconds / 60) / 60) #换算成小时

            # 【后电压合格、找到SN号的】
            if (float(test_parameter['MinData'])*1) <= float(test_crr_data)<=(float(test_parameter['MaxData'])*1) \
                and list_value != False \
                and float(test_parameter['SetDifTimeMin'])<= diff_time <= float(test_parameter['SetDifTimeMax']):

                # 输出【序列号】到UI和EXCEL
                ExceInit.ui_excel_write(self.ui,str(text))
                # 输出【前电压】到UI和EXCEL
                ExceInit.ui_excel_write(self.ui,'%.5f' %(float(list_value['voltage'])*1))
                # 输出【后电压】到UI和EXCEL
                ExceInit.ui_excel_write(self.ui,'%.5f' %(float(test_crr_data)*1))
                # 输出【电压差值】到UI和EXCEL
                diff_voltage = float(list_value['voltage']) - float(test_crr_data) #求电压差

                # 判断电压差值是否大于1000mv`
                if diff_voltage*1000 >= 1000:
                    # 判断电压差值是否大于1000mv
                    # 如果电压差大于等于1000mV，就只输出小数点后面两位数
                    ExceInit.ui_excel_write(self.ui, '%.2f' % (float(diff_voltage) * 1000))
                else:
                    # 如果电压差小于1000mV，就只输出小数点后面五位数
                    ExceInit.ui_excel_write(self.ui, '%.5f' %(float(diff_voltage)*1000))
                # 【电压差OK】
                if float(test_parameter['VoltageDiffMin']) * 1 <= \
                   float('%.5f' %(float(diff_voltage)*1000)) <= \
                   float(test_parameter['VoltageDiffMax'] * 1) :

                    # 输出【PASS压差结果】到UI和EXCEL
                    ExceInit.ui_excel_write(self.ui,'PASS')
                    # 输出【前电压测试时间】到UI和EXCEL
                    ExceInit.ui_excel_write(self.ui,list_value['time'])
                    # 输出【后电压测试时间】到UI和EXCEL
                    ExceInit.ui_excel_write(self.ui,sys_time)
                    # 输出【已静置时间】到UI
                    ExceInit.ui_excel_write(self.ui,'%.2f小时' % diff_time)
                    # 输出【设备编号检查】到UI
                    ExceInit.ui_excel_write(self.ui,'OK')
                    # 记录测试过的SN号，EXCEL的行号，以字典的形式储存到列表中
                    config.sn_list_append_value( sn.save_sn(text,config.get_excel_row_value()) )
                    # UI和EXCEL坐标重新置位
                    config.reset_ui_excel_coordinate()

                # 【电压差NG】（不保存到Excel）
                else:
                    # 输出【NG压差结果】到UI
                    ExceInit.ui_write(self.ui,'NG')
                    # 输出【前电压测试时间】到UI
                    ExceInit.ui_write(self.ui,list_value['time'])
                    # 输出【后电压测试时间】到UI
                    ExceInit.ui_write(self.ui,sys_time)
                    # 输出【已静置时间】到UI
                    ExceInit.ui_write(self.ui,'%.2f小时' % diff_time)
                    # 输出【设备编号检查】到UI
                    ExceInit.ui_write(self.ui,'OK')
                    # 更新ng统计到UI
                    config.change_ng_result_statistics_value(self.ui)
                    # 删除EXCEL中储存的错误信息
                    ExceInit.delete_row(excel_name,config.get_excel_row_value())
                    # UI坐标重新置位
                    config.reset_ui_coordinate()
                    config.change_excel_col_value(1)

                    # 提示出错信息
                    ToolFun.ng_warning(self.res,self.ui,"测试异常",'# 电压差异常 #')

                # 传入SN列表字典，如果SN号已经存在的，删除EXCEL对应行。
                sn_list = config.get_sn_list_value()  # 获取SN储存列表
                sn.sn_judeg(text,sn_list)
                number = int(number) + 1
                config.change_number_value(int(number))
                if number >= 12:# 如果UI已经占满了12行，则插入新行&页面下滚
                    self.ui.TestData.insertRow(config.get_number_value())
                    self.ui.TestData.scrollToBottom()

                # 更新统计到UI
                config.change_ok_result_statistics_value(self.ui)

            # 【后电压不合格】、不保存错误数据
            elif float(test_crr_data) > (float(test_parameter['MaxData']) * 1) \
                 or float(test_crr_data) < (float(test_parameter['MinData']) * 1):

                # 输出【序列号】到UI和EXCEL
                ExceInit.ui_write(self.ui,str(text))
                # 输出【前电压（后电压不合格输出NG）】到UI和EXCEL
                ExceInit.ui_write(self.ui,'后电压NG，不判断')
                # 输出【后电压】到UI和EXCEL
                ExceInit.ui_write(self.ui,'%.5f' %(float(test_crr_data)*1))
                # 输出【电压差值】到UI和EXCEL
                ExceInit.ui_write(self.ui,'后电压NG，不判断')
                # 输出【PASS压差结果】到UI和EXCEL
                ExceInit.ui_write(self.ui, 'NG')
                # 输出【前电压测试时间】到UI和EXCEL
                ExceInit.ui_write(self.ui, list_value['time'])
                # 输出【后电压测试时间】到UI和EXCEL
                ExceInit.ui_write(self.ui, sys_time)
                # 输出【已静置时间】到UI
                ExceInit.ui_write(self.ui, '%.2f小时'%diff_time)
                # 输出【设备编号检查】到UI
                ExceInit.ui_write(self.ui, 'OK')
                # 更新ng统计到UI
                config.change_ng_result_statistics_value(self.ui)

                # 如果UI已经占满了12行，则插入新行&页面下滚
                number = int(number) + 1
                config.change_number_value(int(number))
                if number >= 12:
                    self.ui.TestData.insertRow(config.get_number_value())
                    self.ui.TestData.scrollToBottom()
                # UI坐标重新置位
                config.reset_ui_coordinate()
                # 提示出错信息
                ToolFun.ng_warning(self.res,self.ui,"测试异常","#后电压NG#")

            # 查汇总表无此SN号的
            elif not list_value:
                # 输出【序列号】到UI和EXCEL
                ExceInit.ui_write(self.ui,str(text))
                # 输出【前电压（'汇总表，无此SN'】到UI和EXCEL
                ExceInit.ui_write(self.ui,'汇总表，无此SN或NG')
                # 输出【后电压】到UI和EXCEL
                ExceInit.ui_write(self.ui,'%.5f' %(float(test_crr_data)*1))
                # 输出【电压差值】到UI和EXCEL
                ExceInit.ui_write(self.ui, '汇总表，无此SN或NG')
                # 输出【PASS压差结果】到UI和EXCEL
                ExceInit.ui_write(self.ui, '汇总表，无此SN或NG')
                # 输出【前电压测试时间】到UI和EXCEL
                ExceInit.ui_write(self.ui, '汇总表，无此SN或NG')
                # 输出【后电压测试时间】到UI和EXCEL
                ExceInit.ui_write(self.ui, '汇总表，无此SN或NG')
                # 输出【已静置时间】到UI
                ExceInit.ui_write(self.ui, '汇总表，无此SN或NG')
                # 输出【设备编号检查】到UI
                ExceInit.ui_write(self.ui, '汇总表，无此SN或NG')
                # 更新ng统计到UI
                config.change_ng_result_statistics_value(self.ui)

                # 如果UI已经占满了12行，则插入新行&页面下滚
                number = int(number) + 1
                config.change_number_value(int(number))

                if number >= 12:
                    self.ui.TestData.insertRow(config.get_number_value())
                    self.ui.TestData.scrollToBottom()
                # UI坐标重新置位
                config.reset_ui_coordinate()
                # 提示出错报告信息
                ToolFun.ng_warning(self.res,self.ui,"测试异常","#汇总表，无此SN#")
            # 小于静置要求时间的
            elif diff_time < float(test_parameter['SetDifTimeMin']):
                # 更新ng统计到UI
                config.change_ng_result_statistics_value(self.ui)
                QtWidgets.QMessageBox.critical(self.ui, "静置时间异常", "\t\t  # 静置时间未达到设置的要求 #\
                           \t\t\t# 当前已静置时间为：%.2f小时，未达到要求静置%.2f小时的标准 #" %(diff_time,float(test_parameter['SetDifTimeMax'])))
            # 大于静置要求时间的
            elif diff_time > float(test_parameter['SetDifTimeMax']):
                # 更新ng统计到UI
                config.change_ng_result_statistics_value(self.ui)
                QtWidgets.QMessageBox.critical(self.ui, "静置时间异常", "\t\t  # 静置时间未达到设置的要求 #\
                \t\t\t # 超出了静置上限时间（已静置了:%.2f小时）#" %diff_time)

        # SN长度异常
        else:
            QtWidgets.QMessageBox.critical(self.ui, "SN异常", "# 扫描的SN长度与设置的不一致 #\
                                                             \n  # 或者未进行设置测试参数 #")
